// test_modbus_tcp.c
#include "../unity/unity.h"
#include "modbus_tcp.h"

// 测试用的临时缓冲区
uint8_t rbuf[256];
uint8_t sbuf[256];

#define MAX_ID 100
#define MAX_MOTOR_REG 1106
#define MAX_BOARD_PARAM_REG 142

// 定义 modbus_tcp.c 中引用的外部变量
extern int16_t motor_status_reg_map[2][MAX_MOTOR_REG];
extern int16_t control_board_param_reg_map[2][MAX_BOARD_PARAM_REG];
extern uint32_t motor_position_flags[4];  // 4*32 = 128 bits

// 测试前的设置
void setUp(void) {
    // 每次测试前重置全局变量
    memset(motor_status_reg_map, 0, sizeof(motor_status_reg_map));
    memset(control_board_param_reg_map, 0, sizeof(control_board_param_reg_map));
    memset(motor_position_flags, 0, sizeof(motor_position_flags));
    memset(rbuf, 0, sizeof(rbuf));
    memset(sbuf, 0, sizeof(sbuf));
}

// 测试后的清理
void tearDown(void) {
    // 清理代码
}

// 测试 TCPMDSaveData 函数
void test_TCPMDSaveData(void) {
    uint8_t data[4] = {0x12, 0x34, 0x56, 0x78};
    
    // 测试保存到 motor_status_reg_map
    TEST_ASSERT_EQUAL_INT8(1, TCPMDSaveData(100, data, 2, 0));
    TEST_ASSERT_EQUAL_INT16(0x1234, motor_status_reg_map[0][100]);
    TEST_ASSERT_EQUAL_INT16(0x5678, motor_status_reg_map[0][101]);
}

// 测试 TCPMDReadData 函数
void test_TCPMDReadData(void) {
    motor_status_reg_map[0][100] = 0x1234;
    TEST_ASSERT_EQUAL_INT16(0x1234, TCPMDReadData(100, 0));
}

void test_tcp_modslv_function_03(void) {
    // 设置数据
    motor_status_reg_map[0][100] = 0xABCD;
    motor_status_reg_map[0][101] = 0x1234;
    
    // 构建请求
    rbuf[0] = 0x00; rbuf[1] = 0x01;  // 事务标识符
    rbuf[2] = 0x00; rbuf[3] = 0x00;  // 协议标识符
    rbuf[4] = 0x00; rbuf[5] = 0x06;  // 长度
    rbuf[6] = 0x01;                 // 单元标识符
    rbuf[7] = 0x03;                 // 功能码
    rbuf[8] = 0x00; rbuf[9] = 0x64;  // 起始地址 (100)
    rbuf[10] = 0x00; rbuf[11] = 0x02; // 寄存器数量 (2)
    
    uint16_t response_len = tcp_modslv(rbuf, sbuf, 0);
    
    // 检查 tcp_modslv 是否返回了预期长度，而不是固定值
    TEST_ASSERT_GREATER_THAN(0, response_len);
    TEST_ASSERT_EQUAL_INT8(3, sbuf[7]);     // 功能码
}
// 测试 tcp_modslv 函数 - 功能码 06 (写单个寄存器)
void test_tcp_modslv_function_06(void) {
    rbuf[0] = 0x00; rbuf[1] = 0x01;  // 事务标识符
    rbuf[2] = 0x00; rbuf[3] = 0x00;  // 协议标识符
    rbuf[4] = 0x00; rbuf[5] = 0x06;  // 长度
    rbuf[6] = 0x01;                 // 单元标识符
    rbuf[7] = 0x06;                 // 功能码
    rbuf[8] = 0x00; rbuf[9] = 0x64;  // 寄存器地址 (100)
    rbuf[10] = 0x12; rbuf[11] = 0x34; // 寄存器值 (0x1234)
    
    uint16_t response_len = tcp_modslv(rbuf, sbuf, 0);
    
    TEST_ASSERT_EQUAL_INT16(12, response_len);
    TEST_ASSERT_EQUAL_INT16(0x1234, motor_status_reg_map[0][100]);
}

// 测试主函数
int main(void) {
    
    UNITY_BEGIN();
    RUN_TEST(test_TCPMDSaveData);
    RUN_TEST(test_TCPMDReadData);
    RUN_TEST(test_tcp_modslv_function_03);
    RUN_TEST(test_tcp_modslv_function_06);
    return UNITY_END();
}